package it.polimi.traveldream.managers;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

//import org.apache.commons.codec.digest.DigestUtils;












import it.polimi.traveldream.persistence.GiftListHotel;
import it.polimi.traveldream.persistence.GiftListTour;
import it.polimi.traveldream.persistence.GiftListVolo;
import it.polimi.traveldream.persistence.GruppoUtente;
import it.polimi.traveldream.persistence.PacchettoPersonalizzato;
import it.polimi.traveldream.persistence.PrenotazioneHotel;
import it.polimi.traveldream.persistence.PrenotazioneTour;
import it.polimi.traveldream.persistence.PrenotazioneVolo;
import it.polimi.traveldream.persistence.Utente;
import it.polimi.traveldream.persistence.dtos.GiftListHotelDTO;
import it.polimi.traveldream.persistence.dtos.GiftListTourDTO;
import it.polimi.traveldream.persistence.dtos.GiftListVoloDTO;
import it.polimi.traveldream.persistence.dtos.UserDTO;

@Stateless
public class GiftListManagerImpl implements GiftListManager {
	
	@PersistenceContext
	private EntityManager em;
	@Resource
	private EJBContext context;
	
	public String actualUser(){
		String utente= context.getCallerPrincipal().getName();
		return utente;
	}
	
	public void insertHotelGiftList(GiftListHotelDTO giftDTO){
		GiftListHotel glHotel=em.find(GiftListHotel.class, giftDTO.getIDPrenotazioneHotel());
		if(glHotel!=null){
			convert(glHotel, giftDTO);
			em.merge(glHotel);
		}else{
			glHotel= new GiftListHotel();
			convert(glHotel, giftDTO);
			em.persist(glHotel);
		}
		
	}
	
	public void convert(GiftListHotel glHotel, GiftListHotelDTO glHotelDTO){
		glHotel.setPacchettoPersonalizzato(em.find(PacchettoPersonalizzato.class, glHotelDTO.getIDPacchetto()));
		glHotel.setPrenotazioneHotel(em.find(PrenotazioneHotel.class, glHotelDTO.getIDPrenotazioneHotel()));
		if(glHotelDTO.getPagante()!=null){
			glHotel.setUtente(em.find(Utente.class, glHotelDTO.getPagante().getEmail()));
		}
		else{
			if(glHotelDTO.getEmail()!=null && glHotelDTO.getEmail()!=""){
				Utente u =em.find(Utente.class, glHotelDTO.getEmail());
				if(u!=null){
					glHotel.setUtente(u);
				}
			}
		}
	}
	
	public void insertTourGiftList(GiftListTourDTO giftDTO){
		GiftListTour glTour= em.find(GiftListTour.class, giftDTO.getIDPrenotazioneHotel());
		if(glTour!=null){
			convertTour(glTour, giftDTO);
			em.merge(glTour);
		}else{
			glTour= new GiftListTour();
			convertTour(glTour, giftDTO);
			em.persist(glTour);
		}
		
	}
	
	public void convertTour(GiftListTour glTour, GiftListTourDTO glTourDTO){
		glTour.setPacchettoPersonalizzato(em.find(PacchettoPersonalizzato.class,glTourDTO.getIDPacchetto()));
		glTour.setPrenotazioneTour(em.find(PrenotazioneTour.class,glTourDTO.getIDPrenotazioneHotel()));
		if(glTourDTO.getPagante()!=null){
			glTour.setUtente(em.find(Utente.class, glTourDTO.getPagante().getEmail()));
		}
		else{
			if(glTourDTO.getEmail()!=null && glTourDTO.getEmail()!=""){
				Utente u =em.find(Utente.class, glTourDTO.getEmail());
				if(u!=null){
					glTour.setUtente(u);
				}
			}
		}
	}
	
	public void insertVoloGiftList(GiftListVoloDTO giftDTO){
		GiftListVolo glVolo= em.find(GiftListVolo.class,giftDTO.getIDPrenotazioneHotel());
		if(glVolo!=null){
			convertVolo(glVolo, giftDTO);
			em.merge(glVolo);
		}else{
			glVolo= new GiftListVolo();
			convertVolo(glVolo, giftDTO);
			em.persist(glVolo);
		}
		
	}
	
	public void convertVolo(GiftListVolo glVolo, GiftListVoloDTO glDTO){
		glVolo.setPacchettoPersonalizzato(em.find(PacchettoPersonalizzato.class,glDTO.getIDPacchetto()));
		glVolo.setPrenotazioneVolo(em.find(PrenotazioneVolo.class,glDTO.getIDPrenotazioneHotel()));
		if(glDTO.getPagante()!=null){
			glVolo.setUtente(em.find(Utente.class, glDTO.getPagante().getEmail()));
		}
		else{
			if(glDTO.getEmail()!=null && glDTO.getEmail()!=""){
				Utente u =em.find(Utente.class, glDTO.getEmail());
				if(u!=null){
					glVolo.setUtente(u);
				}
			}
		}
		
	}
	
	public List<UserDTO> findUtente(String nome, String cognome){
		List<Utente> utenti=em.createNamedQuery(Utente.FIND_BY_NAME_SURNAME, Utente.class).setParameter("nome", nome).setParameter("cognome", cognome).getResultList();
		/*if(nome!="" && cognome!=""){
			 utenti= em.createNamedQuery(Utente.FIND_BY_NAME_SURNAME, Utente.class).setParameter("nome", nome).setParameter("cognome", cognome).getResultList();
		}else{
			if(nome!=""){
				utenti= em.createNamedQuery(Utente.FIND_BY_NAME, Utente.class).setParameter("nome", nome).getResultList();
			}else{
				if(cognome!=""){
					 utenti= em.createNamedQuery(Utente.FIND_BY_SURNAME, Utente.class).setParameter("cognome", cognome).getResultList();
				}
				else{
					 utenti= em.createNamedQuery(Utente.FIND_ALL,Utente.class).getResultList();
				}
			}
		}*/
		
		List<UserDTO> utentiDTO= new ArrayList<UserDTO>();
		for (Utente utente : utenti) {
			UserDTO u= new UserDTO();
			u= convert(utente);
			utentiDTO.add(u);
		}
		return utentiDTO;
	}
	
	public UserDTO convert(Utente user) {
		UserDTO userDTO = new UserDTO();
		userDTO.setEmail(user.getEmail());
		userDTO.setFirstName(user.getNome());
		userDTO.setLastName(user.getCognome());
		userDTO.setIsClient(user.getGruppoUtente().contains(
				GruppoUtente.CLIENTE));
		return userDTO;
	}
	
	
	
}
